// 时钟周期：输出脉冲的周期，即两个Tick间隔的时间长度。
// 注意：Tick不等于时钟周期。Tick是输出脉冲触发中断，在特定时间点上产生的标记；而时钟周期是ticks间隔的时间长度。
#include<stdio.h>
#include<unistd.h>
#include"ohos_init.h"
#include"cmsis_os2.h"//内核有关的api
//哪有main函数 只有入口函数
// int main()
// {

// }
void rtoso2_delay_demo(void *arg)
{
    (void)arg;//传过来的参数可能未使用处理未使用的参数
osDelay(100);//延时一秒避免下面的输出跟系统的输出混在一块
    // 在3861上面，每秒100个ticks，每个tick的时钟周期为10ms
    printf("now ticks per second is %d\n",osKernelGetTickFreq());
    //获得当前多少tick
    printf("now ticks number is %d\n",osKernelGetTickCount());
    //延迟1秒 
    //注意：等待指定的ticks，不精确等于等待指定的时钟周期，误差最多会少一个时钟周期(10ms)。
    //有误差的原因是osdelay可能发生在两个tick之间 会少一段时间
    //100个时钟周期100个tick 一个时钟周期是10ms 10*100=1000ms=1s
    osStatus_t status=osDelay(100);
    //再次获得tick数
    printf("after osdealy tick number is %d\n",osKernelGetTickCount());
    //让系统延迟到指定的tick数才能继续运行
    int ticks=osKernelGetTickCount();//获取现在的
    ticks+=100;
    //osStatus_t status=(ticks);
    status=osDelayUntil(ticks);//上面定义过了osStatus_t status 这里直接用就行了
    printf("now status is %d\n",status);
    printf("now tick number is %d\n",osKernelGetTickCount());
}
//入口函数 
void enter(void)
{
    //定义线程的属性
    osThreadAttr_t attr;
    attr.name = "threadBai";//线程名字
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;
    attr.priority = osPriorityNormal;//线程权限
    //创建线程
    if(osThreadNew((osThreadFunc_t)rtoso2_delay_demo,NULL,&attr)==NULL)
    {
        printf("Thread create fail\n");
    }
}
//这个函数未调用 写着玩
//osDelay(1)延时不是有缺陷不准确吗 会出现小于一个tick的误差
//这个函数可以解决这个误差 通过usleep协助实现
//delayTime是你要延时的毫秒数
void sleep(int delayTime){
    //先获得内核每秒的tick数 
    int tick =osKernelGetTickFreq();
    //用1000(1秒)除以tick数得到一个tick所用的时间
    uint32_t time=1000/tick;//unsigned无符号整数 只能存储非负数
    //得到一个tick所用时间后 用delayTime(延时的总时间)/一个tick所用时间得到delayTime时间中有几个整的tick
    //osdelay延时整数个tick
    osDelay(delayTime/time);
    //delayTime%一个tick所用时间得到不能凑成整数tick的时间片段 就是101-102之间osdelay前面的缺少的时间 导致不精确
    uint32_t time2=delayTime%time;
    //把不精确的补上 通过usleep
    if(time2){
    usleep(time2);
    }
}
APP_FEATURE_INIT(enter);